
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author igor_ufrn
 */
public class ClienteDao {

    public Collection<Cliente> findClientes(Integer id, String nome, String identidade, String cpf, Double credito, String observacao, Date dataNascimento) {

        try {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction secondTransaction = session.beginTransaction();

        StringBuilder hqlConsulta = new StringBuilder();
        StringBuilder hqlFiltros = new StringBuilder();
        
        hqlConsulta.append(" FROM Cliente cliente " +
                           " WHERE cliente.tipoPessoa = :Cliente ");
        if( id != null ) {
            hqlFiltros.append(" and  cliente.id = :id");
        }
        
        if( nome != null && !nome.equals("") ) {
            hqlFiltros.append(" and  cliente.nome like :nome ");
        }

        if( identidade != null && !identidade.equals("") ) {
            hqlFiltros.append(" and  cliente.identidade like :identidade ");
        }

        if( cpf != null && !cpf.equals("") ) {
            hqlFiltros.append(" and cliente.cpf like :cpf ");
        }       

        if( observacao != null && !observacao.equals("") ) {
            hqlFiltros.append(" and cliente.observacao like :observacao ");
        }

        if( credito != null ) {
            hqlFiltros.append(" and cliente.credito > :credito ");
        }

        if( dataNascimento != null ) {
            hqlFiltros.append(" and cliente.dataNascimento = :dataNascimento ");
        }

        hqlConsulta.append(hqlFiltros);
        Query q = session.createQuery(hqlConsulta.toString());

        q.setInteger("Cliente", Pessoa.CLIENTE);

        if(id != null) {
            q.setInteger("id", id);
        }

        if( nome != null && !nome.equals("") ) {
            q.setString("nome", "%"+nome+"%");
        }

        if( identidade != null && !identidade.equals("") ) {
            q.setString("identidade", identidade);
        }

        if( cpf != null && !cpf.equals("") ) {
            q.setString("cpf", cpf);
        }        

        if( observacao != null && !observacao.equals("") ) {
            q.setString("observacao", "%"+observacao+"%");
        }

        if( credito != null ) {
            q.setDouble("credito", credito);
        }

        if( dataNascimento != null ) {
            hqlFiltros.append(" and cliente.dataNascimento = :dataNascimento ");
            q.setDate("dataNascimento", dataNascimento);
        }

        List<Object> objetos = q.list();
        Collection<Cliente> clientes = new ArrayList<Cliente>();

        for(Object obj : objetos) {
            clientes.add((Cliente)obj);
        }        

        secondTransaction.commit();
        session.close();

        return clientes;

        }
        catch(Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}